<!--{
    "Title": "Call your code from another module"
}-->

<p>
  In the <a href="/doc/tutorial/create-module.html">previous section</a>, you created a
  <code>greetings</code> module. In this section, you'll write code to make
  calls to the <code>Hello</code> function in the module you just wrote. You'll
  write code you can execute as an application, and which calls code in the
  <code>greetings</code> module.
</p>

<aside class="Note">
  <strong>Note:</strong> This topic is part of a multi-part tutorial that begins
  with <a href="/doc/tutorial/create-module.html">Create a Go module</a>.
</aside>

<ol>
  <li>
    Create a <code>hello</code> directory for your Go module source code. This
    is where you'll write your caller.

    <p>
      After you create this directory, you should have both a hello and a
      greetings directory at the same level in the hierarchy, like so:
    </p>
      <pre>&lt;home&gt;/
 |-- greetings/
 |-- hello/</pre>

    <p>
      For example, if your command prompt is in the greetings directory, you
      could use the following commands:
    </p>

    <pre>
cd ..
mkdir hello
cd hello
</pre
    >
  </li>

  <li>
    Enable dependency tracking for the code you're about to write.

    <p>
      To enable dependency tracking for your code, run the
      <a
        href="/ref/mod#go-mod-init"
        ><code>go mod init</code> command</a>, giving it the name of the module
        your code will be in.</p>

    <p>
        For the purposes of this tutorial, use <code>example.com/hello</code>
        for the module path.
    </p>

    <pre>
$ go mod init example.com/hello
go: creating new go.mod: module example.com/hello
</pre>
  </li>

  <li>
    In your text editor, in the hello directory, create a file in which to
    write your code and call it hello.go.
  </li>

  <li>
    Write code to call the <code>Hello</code> function, then print the
    function's return value.

    <p>
      To do that, paste the following code into hello.go.
    </p>

    <pre>
package main

import (
    "fmt"

    "example.com/greetings"
)

func main() {
    // Get a greeting message and print it.
    message := greetings.Hello("Gladys")
    fmt.Println(message)
}
</pre>

    <p>
      In this code, you:
    </p>

    <ul>
      <li>
        Declare a <code>main</code> package. In Go, code executed as an
        application must be in a <code>main</code> package.
      </li>
      <li>
        Import two packages: <code>example.com/greetings</code> and
        the <a href="https://pkg.go.dev/fmt/"><code>fmt</code> package</a>. This
        gives your code access to functions in those packages. Importing
        <code>example.com/greetings</code> (the package contained in the module
        you created earlier) gives you access to the <code>Hello</code>
        function. You also import <code>fmt</code>, with functions for handling
        input and output text (such as printing text to the console).
      </li>
      <li>
        Get a greeting by calling the <code>greetings</code> package’s
        <code>Hello</code> function.
      </li>
    </ul>
  </li>

  <li>
    Edit the <code>example.com/hello</code> module to use your local
    <code>example.com/greetings</code> module.

    <p>
      For production use, you’d publish the <code>example.com/greetings</code>
      module from its repository (with a module path that reflected its published
      location), where Go tools could find it to download it.
      For now, because you haven't published the module yet, you need to adapt
      the <code>example.com/hello</code> module so it can find the
      <code>example.com/greetings</code> code on your local file system.
    </p>

    <p>
      To do that, use the
      <a href="/ref/mod#go-mod-edit"><code>go
      mod edit</code> command</a> to edit the <code>example.com/hello</code>
      module to redirect Go tools from its module path (where the module isn't)
      to the local directory (where it is).
    </p>

    <ol>
      <li>
        From the command prompt in the hello directory, run the following
        command:

    <pre>
$ go mod edit -replace=example.com/greetings=../greetings
</pre>

    <p>
      The command specifies that <code>example.com/greetings</code> should be
      replaced with <code>../greetings</code> for the purpose of locating the
      dependency. After you run the command, the go.mod file in the hello
      directory should include a <a href="/doc/modules/gomod-ref#replace">
        <code>replace</code> directive</a>:
    </p>

        <pre>
module example.com/hello

go 1.16

<ins>replace example.com/greetings => ../greetings</ins>
</pre>
      </li>

      <li>
        From the command prompt in the hello directory, run the
        <a href="/ref/mod#go-mod-tidy">
        <code>go mod tidy</code> command</a> to synchronize the
        <code>example.com/hello</code> module's dependencies, adding those
        required by the code, but not yet tracked in the module.

        <pre>$ go mod tidy
go: found example.com/greetings in example.com/greetings v0.0.0-00010101000000-000000000000
</pre>
        <p>
         After the command completes, the <code>example.com/hello</code>
         module's go.mod file should look like this:
        </p>

        <pre>module example.com/hello

go 1.16

replace example.com/greetings => ../greetings

<ins>require example.com/greetings v0.0.0-00010101000000-000000000000</ins></pre>

        <p>
          The command found the local code in the greetings directory, then
          added a <a href="/doc/modules/gomod-ref#require"><code>require</code>
          directive</a> to specify that <code>example.com/hello</code>
          requires <code>example.com/greetings</code>. You created this
          dependency when you imported the <code>greetings</code> package in
          hello.go.
        </p>
        <p>
          The number following the module path is a <em>pseudo-version number</em>
          -- a generated number used in place of a semantic version number (which
          the module doesn't have yet).
        </p>
        <p>
          To reference a <em>published</em> module, a go.mod file would
          typically omit the <code>replace</code> directive and use a
          <code>require</code> directive with a tagged version number at the end.
        </p>

        <pre>require example.com/greetings v1.1.0</pre>

        <p>For more on version numbers, see
          <a href="/doc/modules/version-numbers">Module version numbering</a>.</p>
      </li>
    </ol>
  <li>
    At the command prompt in the <code>hello</code> directory, run your code to
    confirm that it works.

    <pre>
$ go run .
Hi, Gladys. Welcome!
</pre>
  </li>
</ol>

<p>
  Congrats! You've written two functioning modules.
</p>

<p>
  In the next topic, you'll add some error handling.
</p>

<p class="Navigation">
  <a class="Navigation-prev" href="/doc/tutorial/create-module.html"
    >&lt; Create a Go module</a
  >
  <a class="Navigation-next" href="/doc/tutorial/handle-errors.html"
    >Return and handle an error &gt;</a
  >
</p>
